MavenProjectでAmazon EC2 Container Registry (ECR)にプッシュしてみた。
はじめに
好物はインフラとフロントエンドのかじわらゆたかです。 ちょうど1ヶ月前、佐々木が以下のブログを上げていました。 【新機能】Amazon EC2 Container Registry (ECR)が東京リージョンにやってきました! | Developers.IO
実際に構築しているJavaのアプリケーションを組み込んだDocker ImageをAmazon ECRにPushするにはどうするんじゃい! と思い調べてみました。
下準備編(Java Application)
Mavenプロジェクトで簡単なSpring Frameworkを用いたアプリを書きました。
pom.xml
<!--?xml version="1.0" encoding="UTF-8"?--> 4.0.0 jp.classmethod ecr_sample 0.0.1-SNAPSHOT jar ecr_sample ECR Sample project for Spring Boot org.springframework.boot spring-boot-starter-parent 1.4.0.RELEASE <!-- lookup parent from repository --> UTF-8UTF-81.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
sampleController.java
package jp.classmethod; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; /** * Created by kajiwarayutaka on 2016/09/16. */ @RestController public class sampleController { @RequestMapping(value = "/" ,method = RequestMethod.GET) public Response getMessage(){ Response response = new Response(); response.setMessage("Hello world."); return response; } } class Response { private String message; public String getMessage(){ return message; } public void setMessage(String message){ this.message = message; } }
上記のような感じでアプリケーションを実装し、レスポンスが返ってくるのを確認します。
$ curl localhost:8080 {"message":"Hello world."}
下準備編(Docker・ECR)
はじめにに記載した佐々木の記事をもとに、 レポジトリの作成とECRへのログインまで完了させてください。
docker-maven-plugin導入
Docker Image作成まで
pom.xml(pluginsの中に追記)
com.spotify docker-maven-plugin 0.4.12 tag-install package build openjdk:8-jre-alpine classmethod/ecr_sample ["java", "-jar", "/${project.build.finalName}.jar"] unix:///var/run/docker.sock / ${project.build.directory} ${project.build.finalName}.jar
解説
unix:///var/run/docker.sock
まず、18行目ですが、これを記載することでUNIXドメインソケットを用いてDockerとやり取りをすることになります。 これを記載しないとTCPでのDockerとやり取りを行うことになります。
openjdk:8-jre-alpine classmethod/ecr_sample ["java", "-jar", "/${project.build.finalName}.jar"]
次に15行目~17行目ですが、作成するDocker Imageの設定になります。 baseImageはその名の通り、ベースとなるDockerのイメージになります。 今回はJavaのアプリケーションということもあり、軽量のDockerImageであるalpineベースのJavaのイメージを用いました。 imageNameは作成するDockerのImage名になります。 entryPointはDockerfileのENTRYPOINTそのものです。
<br /><br />/ ${project.build.directory} ${project.build.finalName}.jar
20行目からのresourcesはDocker Imageに何を含ませるかを指定しています。 Spring Bootのアプリケーションなので、jarを含ませるのみになっています。
<br />tag-install package build
6行目以降のexecutionで、mavenのpackage phaseで、このプラグインのbuildを行うといった記載をしています。 mavenのpackage phaseでDockerのImageが作られる事になります。
実行結果
$ mvn clean package (中略) [INFO] --- docker-maven-plugin:0.4.12:build (tag-install) @ ecr_sample --- [INFO] Copying /Users/kajiwarayutaka/ProjectSand/ecr_sample/target/ecr_sample-0.0.1-SNAPSHOT.jar -> /Users/kajiwarayutaka/ProjectSand/ecr_sample/target/docker/ecr_sample-0.0.1-SNAPSHOT.jar [INFO] Building image classmethod/ecr_sample Step 1 : FROM openjdk:8-jre-alpine ---> 87ec762b5790 Step 2 : ADD /ecr_sample-0.0.1-SNAPSHOT.jar // ---> 8eca3bbd6c92 Removing intermediate container 4ded54ac8a49 Step 3 : ENTRYPOINT java -jar /ecr_sample-0.0.1-SNAPSHOT.jar ---> Running in ad67d9bbb3d5 ---> f1fc360bb0dd Removing intermediate container ad67d9bbb3d5 Successfully built f1fc360bb0dd [INFO] Built classmethod/ecr_sample [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 10.978 s [INFO] Finished at: 2016-09-16T20:30:27+09:00 [INFO] Final Memory: 41M/323M [INFO] ------------------------------------------------------------------------ $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE classmethod/ecr_sample latest f1fc360bb0dd About a minute ago 121.9 MB
Docker Imageが作られたことがわかるかと思います。 一応Docker ImageにJavaのアプリケーションが組み込まれたことも確認しておきます。
$ docker run --name blog_ecr_sample -d -p 8080:8080 classmethod:ecr_sample $ curl localhost:8080 {"message":"Hello world."}
こちらも問題がないことが確認できました。
Amazon EC2 Container Registry (ECR)にプッシュ
pom.xml(pluginsの中に追記)
<br />中略 tag-image package tag classmethod/ecr_sample 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr_sample push-image install push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr_sample 中略 true
解説
executionのところで、タグの付与とイメージのプッシュが増えています。 idがtag-imageがタグの付与、push-imageがイメージのプッシュになります。 タグの付与はdocker上のコマンド以下のように行うコマンドになります。
$ docker tag classmethod/ecr_sample:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr_sample:latest
イメージのプッシュはdocker上のコマンドでは以下のようになります。
$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr_sample:latest
true
最後のconfigurationの中に追加した上記の行ですが、このように書くことで、 このプラグインはAmazon ECRへログイン情報を用いてAmazon ECRへのプッシュを行うといったことが可能になっています。
実行結果
$ $(aws ecr get-login --region ap-northeast-1) Flag --email has been deprecated, will be removed in 1.13. Login Succeeded $ ls ~/.docker config.json machine $ mvn clean install
まとめ
なかなか長旅ではありましたが、これでビルドタスクと同時にDockerのImageをAmazon ECRにプッシュすると言ったことが可能なりました。